package com.example.gestureactivity2.view;

import com.example.gestureactivity2.utils.Logger;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.RelativeLayout;

@SuppressWarnings("unused")
public class GestureView extends RelativeLayout {

	private static final String	TAG	= "GestureView";
	private float				mStartX;				// 初始时x的位置
	private float				mStartY;				// 初始时y的位置
	private boolean				isToRight;				// 标识是否是向右的手势
	private OnFlingListener		mOnFlingListener;

	public GestureView(Context context) {
		super(context);
	}

	public GestureView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public GestureView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
		int action = ev.getAction();
		switch (action) {
		case MotionEvent.ACTION_DOWN:
			isToRight = false;
			// 记录开始时的位置
			mStartX = ev.getX();
			mStartY = ev.getY();
			break;
		case MotionEvent.ACTION_MOVE:
			// 计算已经滑动过的距离
			float distanceX = ev.getX() - mStartX;
			float distanceY = ev.getY() - mStartY;

			// 如果是向右滑动(distanceX>10，默认需要滑动过一段距离)，而且水平滑动的距离>竖直方向滑动的距离
			// 则需要return true，将后续的事件传递给onTouchEvent()进行处理
			if (distanceX > 10 && Math.abs(distanceX) > Math.abs(distanceY)) {
				isToRight = true;
			}
			break;
		case MotionEvent.ACTION_UP:
		case MotionEvent.ACTION_CANCEL:
			isToRight = false;
			break;
		}

		return isToRight;
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		int action = event.getAction();
		switch (action) {
		case MotionEvent.ACTION_DOWN:
			// 记录开始时的位置
			mStartX = event.getX();
			mStartY = event.getY();
			break;
		case MotionEvent.ACTION_MOVE:
			break;
		case MotionEvent.ACTION_UP:
		case MotionEvent.ACTION_CANCEL:
			// 计算手指离开屏幕时，已经滑动过的距离
			float dx = event.getX() - mStartX;
			float dy = event.getY() - mStartY;

			// 如果向右滑动的距离超过10，而且水平方向滑动的距离超过竖直方向滑动的距离
			// 则调用滑动结束时的监听，执行相关操作
			if (dx > 10 && Math.abs(dx) > Math.abs(dy)) {
				if (null != mOnFlingListener) {
					mOnFlingListener.onFlingFinished();
				}
			}

			break;

		}
		return true;
	}

	/**
	 * 手指滑动的监听
	 * 
	 * @author chenchong
	 * 
	 */
	public interface OnFlingListener {
		/**
		 * 滑动结束时需要执行的方法
		 */
		public void onFlingFinished();
	}

	/**
	 * 设置手指滑动的监听
	 * 
	 * @param onFlingListener
	 */
	public void setOnFlingListener(OnFlingListener onFlingListener) {
		this.mOnFlingListener = onFlingListener;
	}

}
